home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-03 / qbasicpg.zip / SEARCH.BAS < prev    next >
BASIC Source File  |  1987-09-18  |  2KB  |  51 lines

  1. DEFLNG A-Z              ' Default variable type is long integer.
  2. LINE INPUT "File to search: ", FileName$
  3. LINE INPUT "Pattern to search for: ", Pattern$
  4. OPEN FileName$ FOR BINARY AS #1
  5.  
  6. CONST PACKETSIZE = 10000, TRUE = -1
  7. PatternLength% = LEN(Pattern$)
  8. FileLength = LOF(1)
  9. BytesLeft = FileLength
  10. FileOffset = 0
  11.  
  12. ' Keep searching as long as there are enough bytes left in
  13. ' the file to contain the pattern you're searching for:
  14. DO WHILE BytesLeft > PatternLength%
  15.  
  16.    ' Read either 10,000 bytes or the number of bytes left in the file,
  17.    ' whichever is smaller, then store them in Buffer$. (If the number
  18.    ' of bytes left is less than PACKETSIZE, the following statement
  19.    ' still reads just the remaining bytes, since binary I/O doesn't
  20.    ' give "read past end" errors):
  21.    Buffer$ = INPUT$(PACKETSIZE, #1)
  22.  
  23.    ' Find every occurrence of the pattern in Buffer$:
  24.    Start% = 1
  25.    DO
  26.       StringPos% = INSTR(Start%, Buffer$, Pattern$)
  27.       IF StringPos% > 0 THEN
  28.  
  29.          ' Found the pattern, so print the byte position in the file
  30.          ' where the pattern starts:
  31.          PRINT "Found pattern at byte number";
  32.          PRINT FileOffset + StringPos%
  33.          Start% = StringPos% + 1
  34.          FoundIt% = TRUE
  35.       END IF
  36.    LOOP WHILE StringPos% > 0
  37.  
  38.    ' Find the byte position where the next I/O operation would take place,
  39.    ' then back up the file pointer a distance equal to the length of the
  40.    ' pattern (in case the pattern straddles a 10,000-byte boundary):
  41.    FileOffset = SEEK(1) - PatternLength%
  42.    SEEK #1, FileOffset + 1
  43.  
  44.    BytesLeft = FileLength - FileOffset
  45. LOOP
  46.  
  47. CLOSE #1
  48.  
  49. IF NOT FoundIt% THEN PRINT "Pattern not found."
  50.  
  51.